package com.yfp.client.service;

import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
import com.yfp.client.domain.OrderCombo;
import com.yfp.client.domain.dto.BalancePayDTO;
import com.yfp.client.domain.dto.CreateWxPayOrderDTO;
import com.yfp.client.domain.dto.StoredCalculateResultDTO;
import com.yfp.client.domain.vo.QrCodeInitVO;
import com.yfp.client.domain.vo.QrCodePayVO;

import java.math.BigDecimal;

public interface PayService {

    /**
     * 创建订单
     *
     * @param openId
     * @param orderId
     * @return
     */
    WxPayUnifiedOrderV3Result.JsapiResult createOrder(String openId, String orderId);

    /**
     * 支付回调
     *
     * @param xmlData
     * @return
     */
    String parseOrderNotifyResult(String xmlData);

    /**
     * 整单退款
     *
     * @param orderCombo 订单详情
     * @return
     */
    Boolean refund(OrderCombo orderCombo);

    /**
     * 退款回调
     *
     * @param xmlData
     * @return
     */
    String parseRefundNotifyResult(String xmlData);

    /**
     * 关闭订单
     *
     * @param orderId
     */
    void closeOrder(String orderId);

    /**
     * 获取支付二维码
     *
     * @param sessionId
     * @return
     */
    QrCodeInitVO qrCodePayPageInit(String sessionId);

    /**
     * 获取支付信息
     *
     * @param wxCode
     * @param prePayId
     * @return
     */
    QrCodePayVO qrCodePayPagePayInfo(String wxCode, String prePayId);

    /**
     * 管理员退款
     *
     * @param orderListId 订单id
     * @param amt         退款金额
     */
    void adminRefund(String orderListId, BigDecimal amt);

    /**
     * 设备发起订单
     *
     * @param openId
     * @param orderId
     * @return
     */
    WxPayUnifiedOrderV3Result.JsapiResult createDeviceOrder(String openId, String orderId);

    /**
     * 设备退款模拟回调
     *
     * @param orderListId
     * @param amt
     * @return
     */
    void parseRefundNotifyResultSimulate(String orderListId, BigDecimal amt);

    /**
     * 创建余额支付订单
     *
     * @param createWxPayOrderDTO
     */
    WxPayUnifiedOrderV3Result.JsapiResult createWxJsapiPayOrder(CreateWxPayOrderDTO createWxPayOrderDTO);

    /**
     * 余额支付
     * 校验支付密码是否正确
     *
     * @param balancePayDTO 余额支付
     */
    void balancePay(BalancePayDTO balancePayDTO);

    /**
     * 余额支付
     * 计算扣款比例并扣款
     *
     * @param balancePayDTO
     * @return
     */
    StoredCalculateResultDTO calculateBalancePay(BalancePayDTO balancePayDTO);

    /**
     * 后台管理余额支付退款
     *
     * @param orderListId
     * @param amt
     */
    void adminBalanceRefund(String orderListId, BigDecimal amt);

    /**
     * 储值退款
     * @param clientId
     */
    void storedRefund(String clientId);

    /**
     * 储值退款回调
     * @param xmlData
     * @return
     */
    String notifyStoredRefund(String xmlData);

    /**
     * 商城订单退款
     * @param id
     */
    void mallOrderRefund(Long id);

    /**
     * 商城订单退款回调通知处理
     * @param xmlData
     * @return
     */
    String notifyMallOrderRefund(String xmlData);
}
